package cn.ch.org.controller;

import cn.ch.org.domain.Employee;
import cn.ch.org.query.EmployeeQuery;
import cn.ch.org.service.IEmployeeService;
import cn.ch.utils.AjaxResult;
import cn.ch.utils.PageList;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

//@Controller标记这是一个controller，用于扫描
@RestController //这里使用resultful的方式来写，包含Controller和ResponseBody
@RequestMapping("/employee")//写一个便捷路径

public class EmployeeController {

   @Autowired//注入
    private IEmployeeService employeeService;

//单条数据的查询
//@SystemLog("单条数据的查询")
    @GetMapping("/{id}")//查询数据用Get，并且要根据id查询，这里面的id可以改变
    public Employee queryId(@PathVariable("id") Long id){//使用@PathVariable来获取请求符中占有的值
        return employeeService.queryById(id);//调用单挑查询查询的方法
    }

//全部数据的查询
//@SystemLog("全部数据的查询")
    @GetMapping//不需要传入id，直接写
    private List<Employee> queryAll(){
        return employeeService.queryAll();//调用查询全部的方法
    }
//删除方法
//@SystemLog("删除方法")
    @DeleteMapping("/{id}")//删除数据，要用DeleteMapping，并且要传入一个id
    public AjaxResult del(@PathVariable("id") Long id){//使用@PathVariable来获取请求符中占有的值
        //需要返回删除完成后的提示数据
        //方法一：只不过这个方法比较low，以后不建议使用

       /* try {//抛个异常
            employeeService.remove(id);//调用删除的方法
            return new AjaxResult();//成功里返回一个AjaxResult对象
        } catch (Exception e) {//如果有异常
            e.printStackTrace();
            AjaxResult result = new AjaxResult();//也要创建一个AjaxResult对象
            result.setSuccess(false);//设置返回结果为false
            result.setMessage("删除出现故障，正在紧急联系程序员。。。");//设置错误的返回数据
            return result;//返回以上结果
        }

        //方法二：在方法里面返回一个对象，没有什么大的改变，一般也不推荐使用

        try {//抛个异常
            employeeService.remove(id);//调用删除的方法
            return AjaxResult.me();//成功里返回一个AjaxResult对象，这里调用了里面的方法
        } catch (Exception e) {//如果有异常
            e.printStackTrace();
            AjaxResult result = AjaxResult.me();//也要创建一个AjaxResult对象
            result.setSuccess(false);//设置返回结果为false
            result.setMessage("删除出现故障，正在紧急联系程序员。。。");//设置错误的返回数据
            return result;//返回以上结果
        }*/

        //方法三：在企业里面用的比较多，使用链式编程的方式，来返回删除的值
        try {//抛个异常
            employeeService.remove(id);//调用删除的方法
            return AjaxResult.me();//成功里返回一个AjaxResult对象，这里调用了里面的方法你
        } catch (Exception e) {//如果有异常
            e.printStackTrace();
            return AjaxResult.me()
                    .setSuccess(false)
                    .setMessage("删除出现故障，正在紧急联系程序员。。。");//链式编程返回结果
        }
    }

//批量删除
    /*
     * 批量删除
     *  前端传递的是数组，后面可以使用List 或者数组接收
     *
     * @param ids
     * @return

     */

    //@SystemLog("批量删除")
    @PatchMapping
    public AjaxResult batch(@RequestBody List<Long> ids){
        try {
            employeeService.batch(ids);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me()
                    .setSuccess(false)
                    .setMessage("噢哟，系统报错了，我们正在殴打程序员！！");
        }
    }


//分页查询数据
////@SystemLog("分页查询数据")
    @PostMapping//分页+高级查询使用 @PostMapping
    public PageList<Employee> pageList(@RequestBody EmployeeQuery query){//因为掺入的是一个对象，所有要用@RequestBody
        try {
            return employeeService.queryList(query);//调用分页查询的方法
        } catch (Exception e) {
            e.printStackTrace();
            return new PageList<>();
        }
    }
//添加和修改数据
////@SystemLog("添加和修改数据")
    @PutMapping//添加和修改数据使用@PutMapping
    @ApiOperation(value = "新增或修改，如果传递ID=修改，否则新增" )
    public AjaxResult addOrUpdate(@RequestBody Employee employee){//传入一个对象
        try {
            if(employee.getId() == null || employee.getId() == 0){//判断是否传入过来id
                employeeService.add(employee);//调用添加的方法
                return AjaxResult.me();//返回操作成功的提示信息
            }
            employeeService.update(employee);//如果有id传入，则调用修改的方法
            return AjaxResult.me();//返回操作成功的提升信息
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me()
                    .setSuccess(false)
                    .setMessage("删除出现故障，正在紧急联系程序员。。。");//链式编程返回结果
        }
    }

    /**
     * 根据shopId查询到商家
     * @param shopId
     * @return
     */
    @GetMapping("/list/{shopId}")
    public List<Employee> queryByShopId(@PathVariable("shopId") Long shopId){
        return employeeService.queryByShopId(shopId);
    }
}